/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[TestLinkedList.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package collections;

import java.util.LinkedList;

/**
 * 集合框架 - java.util.LinkedList
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class TestLinkedList {

	/**
	 * 使用LinkedList模拟队列<br/>
	 * 
	 * 在队列中, 数据元素只能从队尾进入, 从队首取出[FIFO]<br/>
	 * 在队列中, 数据元素可以任意增减, 但数据元素的次序不会改变<br/>
	 * 每当有数据元素从队列中被取出,后面的数据元素依次向前移动一位, 所以, 任何时候从队列中读到的都是队首的数据<br/>
	 * 
	 * @author 不落的太阳(Sean Yang)
	 * @version 1.0
	 * @since jdk 1.8
	 *
	 */
	class ImitationQueue<T> {

		private LinkedList<T> data = new LinkedList<T>();

		public ImitationQueue() {
		}

		/**
		 * 向队列添加一个元素, 只能加入到队尾
		 * 
		 * @param t
		 */
		public void add(T t) {
			this.data.addLast(t);
		}

		/**
		 * 查看队首元素, 数据还保留在队列中
		 * 
		 * @return 队首元素
		 */
		public T peek() {
			if (data.isEmpty()) {
				System.out.println("队列中没有元素!");
				return null;
			}
			return data.getFirst();
		}

		/**
		 * 删除队首元素
		 * 
		 * @return 队首元素
		 */
		public boolean remove() {
			if (data.isEmpty()) {
				System.out.println("队列中没有元素!");
				return false;
			}
			data.removeFirst();
			return true;
		}

		/**
		 * 弹出元素, 即获取队首元素并将其从队列中删除
		 * 
		 * @return 队首元素
		 */
		public T pop() {
			if (data.isEmpty()) {
				System.out.println("队列中没有元素!");
				return null;
			}
			return data.removeFirst();
		}

		/**
		 * 在队列中查找元素, 返回第一次出现的位置
		 * 
		 * @param t
		 * @return 元素第一次出现的位置
		 */
		public int indexOf(T t) {
			if (data.isEmpty()) {
				return -1;
			}
			return data.indexOf(t);
		}

		/**
		 * 在队列中查找元素, 返回最后一次出现的位置
		 * 
		 * @param t
		 * @return 元素最后以此出现的位置
		 */
		public int lastIndexOf(T t) {
			if (data.isEmpty()) {
				return -1;
			}
			return data.lastIndexOf(t);
		}

		/**
		 * 判断队列是否为空
		 * 
		 * @return 是否为空
		 */
		public boolean isEmpty() {
			return data.isEmpty();
		}

		/**
		 * 清除队列中所有元素
		 */
		public void clear() {
			data.clear();
		}

	}

	public static void main(String[] args) {
		TestLinkedList o = new TestLinkedList();
		ImitationQueue<String> queue = o.new ImitationQueue<>();

		// 向队列插入元素
		queue.add("one");
		queue.add("two");
		queue.add("three");
		queue.add("four");
		queue.add("five");

		// 获取第一个元素one
		System.out.println("队首的数据是: " + queue.peek());

		// 删除元素: 第一个元素one被删除
		queue.remove();

		// 获取第一个元素并删除: 元素two被删除
		System.out.println("从队列弹出数据: " + queue.pop());

		// 查找three第一次出现的位置
		System.out.println("three第一次在队列中出现的位置: " + queue.indexOf("three"));

		// 查找three最后一次出现的位置
		System.out.println("three最后一次在队列中出现的位置: " + queue.lastIndexOf("three"));

		// 清除队列中的所有元素
		queue.clear();

		// 判断队列中的元素个数是否为0
		System.out.println("队列中的元素个数是否为0: " + queue.isEmpty());
	}
}